package cn.itcast.demo.dao;

import cn.itcast.demo.pojo.User;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class FakeDao {

    @Autowired
    private RestTemplate restTemplate;

    Logger logger = LoggerFactory.getLogger(FakeDao.class);

    @HystrixCommand(fallbackMethod = "queryUserByIdFallback")//回调执行的时机为当前这个方法请求失败（超时，服务 不存在）
    public User queryUserById(Long id) {

        //此时host和port变活，之后请求的时候，不用再关系user-service的实际地址是多少，

        //根据user-service暴露的rest地址来请求得到对应的user


        //之前我们根据discoverClient来请求的，此时我们换成了restTemplate直接请求，之所以敢直接
        //是因为他有Ribbon的加持，所以他自己可以负载均衡（1，获取所有资源，2，选择，3，使用）


        long start = System.currentTimeMillis();
        User user = restTemplate.getForObject("http://user-service/user/" + id, User.class);

        long end = System.currentTimeMillis();


        logger.info("本次查询id为:{}真正耗时:{}",id,end-start);

        return user;
    }



    //回调方法，当上面的执行出问题才调用,回调方法的返回值类型需要和原始方法一直，参数列表一直
    public User queryUserByIdFallback(Long id) {

        User user = new User();
        user.setId(id);

        user.setName("查询失败");

        return user;
    }
}
